package top.goldenyear.porpoise.common.core.exception.enums;


import top.goldenyear.porpoise.common.core.exception.ErrorCode;

/**
 * 全局错误码枚举 0-999 系统异常编码保留
 *
 * <p>一般情况下，使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status 虽然说，HTTP
 * 响应状态码作为业务使用表达能力偏弱，但是使用在系统层面还是非常不错的 比较特殊的是，因为之前一直使用 0 作为成功，就不使用 200 啦。
 *
 * @author airhead
 */
public interface GlobalErrorCode {

  ErrorCode SUCCESS = new ErrorCode(200, "成功");

  // ========== 客户端错误段 ==========

  ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确");
  ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录");
  ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限");
  ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到");
  ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确");

  /** 并发请求，不允许 */
  ErrorCode LOCKED = new ErrorCode(423, "请求失败，请稍后重试");

  ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁，请稍后重试");

  // ========== 服务端错误段 ==========

  ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常");
  ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启");
  ErrorCode ERROR_CONFIGURATION = new ErrorCode(502, "错误的配置项");

  /** 重复请求 */
  // ========== 自定义错误段 ==========
  ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求，请稍后重试");

  ErrorCode DEMO_DENY = new ErrorCode(901, "演示模式，禁止写操作");

  ErrorCode UNKNOWN = new ErrorCode(999, "未知错误");

  /**
   * 是否为服务端错误，参考 HTTP 5XX 错误码段
   *
   * @param code 错误码
   * @return 是否
   */
  static boolean isServerErrorCode(Integer code) {
    return code != null
        && code >= INTERNAL_SERVER_ERROR.getCode()
        && code <= INTERNAL_SERVER_ERROR.getCode() + 99;
  }
}
